#include "serialport.h"
#include <QMessageBox>

Serialport::Serialport(QObject *parent) : QObject(parent)
{
    serial = new QSerialPort(this);
    //绑定后信号槽函数：
    connect(serial, SIGNAL(readyRead()), this, SLOT(readData()));
    connect(serial, SIGNAL(errorOccurred(QSerialPort::SerialPortError)),this, SLOT(error(QSerialPort::SerialPortError)));

}


void Serialport::start(QString com,int bound)
{
    serial->setPortName(com);                   // 设置端口
    serial->setBaudRate(bound);                 // 波特率
    serial->setDataBits(QSerialPort::Data8);    // 数据位
    serial->setParity(QSerialPort::NoParity);   // 校验位
    serial->setStopBits(QSerialPort::OneStop);  // 停止位
    serial->setFlowControl(QSerialPort::NoFlowControl); // 流控
    serial->open(QIODevice::ReadWrite);
}

void Serialport::start(QString com)
{
    serial->setPortName(com);                   // 设置端口
    serial->setDataBits(QSerialPort::Data8);    // 数据位
    serial->setParity(QSerialPort::NoParity);   // 校验位
    serial->setStopBits(QSerialPort::OneStop);  // 停止位
    serial->setFlowControl(QSerialPort::NoFlowControl); // 流控
    serial->open(QIODevice::ReadWrite);
}
bool Serialport::setBaud(int baud)
{
   serial->setBaudRate(baud);
}
bool Serialport::isOpen(void)
{
   return serial->isOpen();
}
void Serialport::close(void)
{
    serial->close();
}

QStringList Serialport::getPortList(void)
{
    QStringList portList;
    const auto infos = QSerialPortInfo::availablePorts();
    portList.clear();
    for (const QSerialPortInfo &info : infos) {
        portList.append(info.portName());
    }
    return portList;
}

void Serialport::error(QSerialPort::SerialPortError serialPortError)
{
    // 错误提示
    if(serialPortError!=QSerialPort::NoError)
    {
        emit connectErr(serial->errorString());
        if (serial->isOpen())
        {
            serial->close();
        }
    }
}

void Serialport::readData()
{
    char rebuf[1024];    //数据接受缓存
    qint64 length = serial->read(rebuf, 1024);
    emit getData(rebuf, length);
}


void Serialport::writeData(uint8_t *data,int len)
{
    if(serial->isOpen())
    {
        serial->write((char *)data,len);
    }
}

void Serialport::writeStr(char *data)
{
    if(serial->isOpen())
    {
        serial->write(data);
    }
}
